package cn.biplam.back.operator.ddl.db2sql;

import java.util.ArrayList;

import cn.biplam.common.client.OperatorResult;
import cn.biplam.common.interfaces.DataOperator;
import cn.biplam.common.opcode.sqlengine.DDLParserCode.TypeParserRuleCode;
import cn.biplam.common.wrapper.ErrorMessage;

/**
 * 从规则库中读取要转换的数据类型和语义模型元类型对应的关系<br>
 * <li>根据数据库数据类型名查询数据库数据类型对应的元数据类型名称
 * <li>根据数据长度、精度和名称进行精确查询数据库数据类型对应的元数据类型名称
 * <li>查询数据库数据类型对应的默认元数据类型名称
 * @author XiaoRuxing 2009-6-15上午09:05:46
 * @version 1.0
 */
public class TypeParserInfo extends DataOperator{

	public TypeParserInfo() throws ErrorMessage{
		super("type_parser_rule");
	}

	@Override
	public OperatorResult _exchange() throws ErrorMessage{
		ArrayList<String> sql=new ArrayList<String>();
		if(opId.equals(TypeParserRuleCode.Get_Model_Type)){
			this.getModelType(sql);
			return this.doing(sql,Operator_Type.Select);
		}else if(opId.equals(TypeParserRuleCode.Get_Model_Type_Detail)){
			this.getModelTypeDetial(sql);
			return this.doing(sql,Operator_Type.Select);
		}else if(opId.equals(TypeParserRuleCode.Get_Model_Type_Default)){
			this.getDefaultType(sql);
			return this.doing(sql,Operator_Type.Select);
		}else{
			throw new ErrorMessage("Operator Exchange outport not found:"+ opId+" !");
		}
	}
	
	/**
	 * 根据类型名称查询语义模型对应类型
	 * @param sql
	 */
	public void getModelType(ArrayList<String> sql){
		StringBuilder sp=new StringBuilder();
		sp.append("select a.model_type_name  ");
		sp.append("from type_parser_rule a   ");
		sp.append("where a.type_name='");
		sp.append(this.filter.getValue("type_name"));
		sp.append("' and a.type_database='");
		sp.append(this.filter.getValue("type_database"));
		sp.append("'");
		sql.add(sp.toString());
	}

	/**
	 * 根据数据类型的数据长度、精度和名称查询语义模型数据类型
	 * @param sql
	 */
	public void getModelTypeDetial(ArrayList<String> sql){
		StringBuilder sp=new StringBuilder();
		String scale = this.filter.getValue("type_scale");
		sp=new StringBuilder();
		sp.append("select a.model_type_name  ");
		sp.append("from type_parser_rule a   ");
		sp.append("where a.type_name='");
		sp.append(this.filter.getValue("type_name"));
		sp.append("' and a.type_precision=");
		sp.append(this.filter.getValue("type_precision"));
		if(scale!=null){
			sp.append(" and a.type_scale=");
			sp.append(scale);
		}
		sp.append(" and a.type_database='");
		sp.append(this.filter.getValue("type_database"));
		sp.append("'");
		sql.add(sp.toString());
	}

	/**
	 * 查询数据类型名称对应默认语义模型数据类型
	 * @param sql
	 */
	public void getDefaultType(ArrayList<String> sql){
		StringBuilder sp=new StringBuilder();
		sp.append("select a.model_type_name  ");
		sp.append("from type_parser_rule a   ");
		sp.append("where a.type_name='");
		sp.append(this.filter.getValue("type_name"));
		sp.append("' and a.type_database='");
		sp.append(this.filter.getValue("type_database"));
		sp.append("' and a.type_precision is null");
		sql.add(sp.toString());
	}
}
